package util.mysql;
import java.sql.*;//导入数据库相关类库
import java.util.Date;

import util.exceltion.MyException;


/**
 * MysqlHandler MySQL数据库管理类，使用数据库连接池
 * @author 莫东林
 * @date 2018.11.13
 */
public class MySQLHandler{   
    //依然是那熟悉的三个必备参数
    private Connection conn = null;
    private PreparedStatement stmt = null;
    private ResultSet rs = null;
    //建立数据库连接，此处仅用于提供原始连接，供放入池中使用
    public Connection buildConnection() {        
         String driver = "com.mysql.jdbc.Driver";
         String url = "jdbc:mysql://111.230.9.127:3306/atm?useUnicode=true&characterEncoding=utf-8&useSSL=true";//数据库连接字符串
         String user = "root";
         String password = "modonglin";
         try{
            Class.forName(driver);//加载驱动程序
            conn=DriverManager.getConnection(url,user,password);
         }
         catch(Exception ex){
            //暂时不处理（未throw），加上日志模块后记在日志里
        	System.out.println("数据库连接失败");
            new MyException(new Date(),ex.getMessage(),"数据库连接建立异常");
         }
        return conn;
    }
    //操作1，“增删改查”中，增、删、改都是执行sql语句，无需返回ResultSet结果集，所以设置为一个方法
    public int execute(String sql) throws MyException{
        try {
            if(conn==null){//未分配
                conn=MySQLPool.getConnecton();//用时从池中取，很爽快
            }
            stmt = conn.prepareStatement(sql);
            int affectedCount = stmt.executeUpdate(sql);//此处真正执行stmt定义的操作
            return affectedCount;//这个是收到影响的行数
        }
        catch (Exception ex) {
            throw new MyException(new Date(),ex.getMessage(),"数据库连接错误");
        }
    }
    //操作2，如果是查询，需返回结果集
    public ResultSet query(String sql)throws Exception{
        try{
            if(conn==null){//未分配
                conn=MySQLPool.getConnecton();//用时从池中取，很爽快
            }
            stmt=conn.prepareStatement(sql);
            rs = stmt.executeQuery(sql);//执行pstmt中定义的查询
            return rs;//将结果集返回 
        }
         catch (Exception ex) {
            throw new MyException(new Date(),ex.getMessage(),"数据库连接错误");
         }
    }
    
    //根据sql语句获取预编译执行对象
    public PreparedStatement getStmt(String sql)throws Exception{
    	try {
			if(conn == null){
				conn = MySQLPool.getConnecton();
			}
			stmt = conn.prepareStatement(sql);
			return stmt;
		} catch (Exception e) {
			e.printStackTrace();
//			throw new MyException(new Date(),e.getMessage(),"数据库连接错误");
		}
    	return null;
    }
    
    //执行预编译语句
    public ResultSet queryStmt(PreparedStatement stmt)throws Exception{
        try{
            if(conn==null){//未分配
                conn=MySQLPool.getConnecton();//用时从池中取，很爽快
            }
            rs = stmt.executeQuery();//执行pstmt中定义的查询
            return rs;//将结果集返回 
        }
         catch (Exception ex) {
            throw new MyException(new Date(),ex.getMessage(),"数据库连接错误");
         }
    }
    
    //操作3，释放资源
    public void sayGoodbye(){
        if(rs!=null){//关闭结果集，这个不关闭也浪费
            try {
                rs.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if(stmt!=null){//关闭Statement，不要浪费
            try {
                stmt.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        //此处注意，conn在池中管理，不用关闭，用完回归连接池继续使用
        MySQLPool.release(conn);
    }

}